package com.hzdl.hotel.util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class ZXingUtil {


    // 定义颜色
    private static final int BLACK = 0xFF000000;// 黑
    private static final int WHITE = 0xFFFFFFFF;// 白


    // 创建对象，保存二维码设置信息
    private static Map<EncodeHintType, Object> hint = null;

    static {
        hint = new HashMap<>();
        // 纠错级别 L(7%)<M(15%)<Q(25%)<H(30%)
        // 纠错级别越高，纠错信息占用的空间越多，那么能存储的有用信息就越少
        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //设置编码格式
        hint.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 边距大小  1,2,3,4  （4 是最大）
        hint.put(EncodeHintType.MARGIN, 1);
    }


    /**
     * 创建二维码
     */
    public static BufferedImage createZXingCode(String content) {
        try {

            // BitMatrix encode(String var1, BarcodeFormat var2, int var3, int var4, Map<EncodeHintType, ?> var5)

            // 创建二维码对象
            /**
             * var1 : 保存的内容
             * var2 ： BarcodeFormat.QR_CODE:要解析的类型（二维码）
             * var3 ：二维码宽
             * var4 ： 二维码高
             * var5 ： 二维码基础设置
             */
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300, 300, hint);


            int width = bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
//             public BufferedImage(int width, int height, int imageType);
            /**
             * width ： 二维码宽
             * height ： 二维码 高
             * imageType ： 类型
             */
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            // 绘制二维码
            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    image.setRGB(i, j, bitMatrix.get(i, j) ? BLACK : WHITE);
                }
            }

            return image;


        } catch (Exception e) {
            e.printStackTrace();
        }


        return null;
    }


//    /**
//     * 创建带logo的二维码
//     * @param content
//     * @param _width
//     * @param _height
//     * @param logoStream
//     * @return
//     */
//    public static BufferedImage createZXingCodeByLogo() {
//        try {
//            // 获取二维码对象
//            BufferedImage image = createZXingCode(content, _width, _height);
//
//
//            if (logoStream != null) {
//                // 添加LOGO
//
//                // logo输入流转换为BufferedImage
//                BufferedImage logoImage = ImageIO.read(logoStream);
//
//                //获取logo宽高
//                int logo_width = logoImage.getWidth();
//                int logo_height = logoImage.getHeight();
//
//                // 获取二维码的宽高
//                int width = image.getWidth();
//                int height = image.getHeight();
//
//
//                // logo的大小是二维码的1/5
//                int ewm_width = width / 5;
//                int ewm_height = height / 5;
//
//                // 计算最终logo的大小
//                logo_width = logo_width > ewm_width ? ewm_width : ewm_width;
//                logo_height = logo_height > ewm_height ? ewm_height : logo_height;
//
//
//                // 如何确定显示为位置
//                int x = (width - logo_width) / 2;
//                int y = (height - logo_height) / 2;
//
//                // 从二维码图片对象中获取画笔对象
//                Graphics2D graphics = image.createGraphics();
//                // 把logo图片绘制到二维码中
//                graphics.drawImage(logoImage, x, y, logo_width, logo_height, null);
//
//                graphics.setStroke(new BasicStroke(2));
//                graphics.setColor(Color.WHITE);
//                //画白色边框
//                graphics.drawRoundRect(x, y, logo_width, logo_height, 15, 15);
//                graphics.dispose();//让画上的去的内容生效
//            }
//
//            return  image;
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//
//        return  null;
//    }

}
